package Utils;

import com.my.DAO.MyDAO;
import com.my.DAO.MyDAO2;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;

import java.io.IOException;

// 如果每次创建一个接口 都得创建一个beanDefinition 很麻烦 所以我们可以使用这个 来将创建BeanDefinition交给她
//但是如果每次新增一个接口 然后再在这里添加代码还是很麻烦 所以我们可以扫描某个路径下的所有class文件
//我们需要一个扫描器  这里可以借助Spring提供的扫描器
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
//        定义扫描路径
        String path = "com.my.DAO";
        MyScanner myScanner = new MyScanner(registry);
        myScanner.addIncludeFilter(new TypeFilter() {
            @Override
            public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
                return true;
            }
        });
//        开始扫描
        myScanner.doScan(path);//创建了BeanDefinition 并完成了注册 所以不需要下面的代码

////        创建一个BeanDefinition
//        AbstractBeanDefinition beanDefinition1 = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
////        将类添加到BeanDefinition中
//        beanDefinition1.setBeanClass(MyFactoryBean.class);
////        给FactoryBean中的构造器赋值
//        beanDefinition1.getConstructorArgumentValues().addGenericArgumentValue(MyDAO.class);
////        注册BeanDefinition
//        registry.registerBeanDefinition("user1",beanDefinition1);
//
//
//
//        //        创建一个BeanDefinition
//        AbstractBeanDefinition beanDefinition2= BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
////        将类添加到BeanDefinition中
//        beanDefinition2.setBeanClass(MyFactoryBean.class);
////        给FactoryBean中的构造器赋值
//        beanDefinition2.getConstructorArgumentValues().addGenericArgumentValue(MyDAO2.class);
////        注册BeanDefinition
//        registry.registerBeanDefinition("user2",beanDefinition2);
    }


}
